#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <cstring>
#include <cerrno>
#include <stdlib.h>

using namespace std;

void handler(int sig)
{
    cout << "get a sig : " << sig << endl; // 异常还在
    exit(1);
}
int main()
{
    signal(SIGFPE, handler);
    // 除0
    int a = 10;
    a /= 0;

    // int *p = nullptr;
    // *p = 100; // 野指针

    while(true) sleep(1);

    return 0;
}


/*
int g_cnt = 0;
void handler(int sig)
{
    cout << "get a sig : " << sig << ",g_cnt : " << g_cnt << endl;
    unsigned int n = alarm(5);
    cout << "还剩多少时间" << n << endl;
}
int main()
{
    // 设定一个闹钟
    signal(SIGALRM,handler);
    // 响一次
    alarm(1);

    while(true)
    {
        g_cnt++;
    }

    // int cnt = 0;
    // while(true)
    // {
    //     sleep(1);
    //     cout << "cnt : " << cnt++ << ", pid is : " << getpid() << endl;
    //     if(cnt == 2)
    //     {
    //         int n = alarm(0); //alarm(0) : 取消闹钟
    //         cout << " alarm(0) ret : " << n << endl;
    //     }
    // }

    return 0;
}
*/

/*
void handler(int signumber)
{
    cout << " get a signal, number is : " << signumber << endl;
}
int main()
{
    signal(6,handler);
    int cnt = 0;
    while(true)
    {
        cout << "cnt: " << cnt++ << endl;
        sleep(1);
        if(cnt % 5 == 0)
        {
            cout << "send 2 to caller" << endl;
            // raise(2); //SIGSTOP : 19
            abort(); // 6
        }
    }

    return 0;
}
*/

/* // mykill -9 pid
int main(int argc,char *argv[])
{
    if(argc < 3)
    {
        cout << "Usage: " << argv[0] << "-signumber pid" << endl;
        return 1; 
    }

    int signumber = stoi(argv[1] + 1);
    int pid = stoi(argv[2]);

    int n = kill(pid,signumber);
    if(n < 0)
    {
        cerr << "kill error" << strerror(errno) << endl;
    }

    return 0;
}
*/


/*
void handler(int signo)
{
    std::cout << "get a sig,number is : " << signo << std::endl;
}
int main()
{
    // signal调用玩，handler方法不会立即执行，设置对应信号的处理方法
    // 未来收到对应的信号才会执行handler方法
    // 未来如果永远没有收到对应SIGINT，handler也就永远不调用
    signal(SIGINT,handler); //handler(SIGINT)
    // ctrl + c ---> 解释成2号信号 ---> 向进程发送 ---> 进程收到 ---> 进程响应

    // signal(SIGINT,SIG_IGN); //ignore 
    
    while(true)
    {
        std::cout << "I am activing...,pid: " << getpid() << std::endl;
        sleep(1);
    }

    return 0;
}
*/